<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="https://www.w3.org/1999/xhtml" xml:lang="zh-CN" lang="zh-CN">
<head><meta http-equiv="Content-Type" content="application/xhtml+xml; charset=utf-8">
  <title>7.12. 为设备创建惯用符号连接</title>
  <link rel="stylesheet" href="../stylesheets/lfs.css" type="text/css">
  <link rel="stylesheet" href="../stylesheets/lfs-print.css"
 type="text/css" media="print">
<script> var _hmt = _hmt || []; (function() { var hm = document.createElement("script"); hm.src = "https://hm.baidu.com/hm.js?d286c55b63a3c54a1e43d10d4c203e75"; var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(hm, s); })(); </script>
</head>
<body id="lfs" class="6.2">
<div class="navheader">
<div class="headertitles">
<h4>Linux From Scratch - 版本 6.2</h4>
<h3>第七章 配置系统启动脚本</h3>
</div>
<ul class="headerlinks">
  <li class="prev"> <a accesskey="p" href="hosts.html"
 title="定制 /etc/hosts 文件">后退</a>
    <p>定制 /etc/hosts 文件</p>
  </li>
  <li class="next"> <a accesskey="n" href="network.html" title="配置网络脚本">前
进</a>
    <p>配置网络脚本</p>
  </li>
  <li class="up"><a accesskey="u" href="chapter07.html"
 title="第七章 配置系统启动脚本">上一级</a></li>
  <li class="home"><a accesskey="h" href="../index.html"
 title="Linux From Scratch - 版本 6.2">首页</a></li>
</ul>
</div>
<div class="sect1">
<div class="titlepage">
<h1 class="sect1">7.12. 为设备创建惯用符号连接</h1>
</div>
<div class="sect2">
<div class="titlepage">
<h2 class="sect2">7.12.1. CD-ROM symlinks</h2>
</div>
<p>我们可能装一些软件用到 cdrom dvd 等，因此我们会需要把 /dev/cdrom /dev/dvd 的符号链接加在<tt
 class="filename">/etc/fstab</tt>中。对于每一个CD-ROM 设备，在 <tt
 class="filename">/sys 下找到相应的目录</tt>(例如, <tt class="filename">/sys/block/hdd</tt>)
，然后运行如下命令：</p>
<pre class="userinput"><kbd class="command">udevtest /block/hdd</kbd></pre>
<p>观察一下包含很多 *_id 输出的程序的行。</p>
<p>有两种方法可以创建symlinks，可以用model名及序号，或是用设备在总线上的位置。 以第一种方法，可以创建如下文件：</p>
<pre class="userinput"><kbd class="command">cat &gt;/etc/udev/rules.d/82-cdrom.rules &lt;&lt; EOF<br><tt
 class="literal">
# Custom CD-ROM symlinks
SUBSYSTEM=="block", ENV{ID_MODEL}=="SAMSUNG_CD-ROM_SC-148F", \
    ENV{ID_REVISION}=="PS05", SYMLINK+="cdrom"
SUBSYSTEM=="block", ENV{ID_MODEL}=="PHILIPS_CDD5301", \
    ENV{ID_SERIAL}=="5VO1306DM00190", SYMLINK+="cdrom1 dvd"
</tt>
EOF</kbd></pre>
<div class="note">
<div class="admonhead"> <img alt="[Note]" src="../images/note.png">
<h3 class="admontitle">注意</h3>
</div>
<div class="admonbody">
<p>这个例子能正常工作，但 udev 不能识别 \ 的继续上一行功能，所以若要用编辑器来编辑 udev 的规则时，一定要保证每行只有一个命令。</p>
</div>
</div>
<p>做完这些symlinks就会保持正常工作状态，即使把cdrom移到 IDE
总线的其他位置上也能正常工作。但是如果使用新的驱动器来替换原来的 SAMSUNG CD-ROM，<tt class="filename">/dev/cdrom
符号链接将不会被创建。</tt><br>
</p>
<p>SUBSYSTEM=="block" 关键字是为了避免匹配一般的 SCSI 设备。 在没有这个关键字的情况下，若同时存在两个 SCSI
CD-ROM， 这个符号链接有时会指向<tt class="filename"> /dev/srX</tt> 设备 ，但有时会错误的指向 <tt
 class="filename">/dev/sgX</tt>。</p>
<p>第二种方法的步骤：</p>
<pre class="userinput"><kbd class="command">cat &gt;/etc/udev/rules.d/82-cdrom.rules &lt;&lt; EOF<br><tt
 class="literal">
# Custom CD-ROM symlinks
SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", \
    ENV{ID_PATH}=="pci-0000:00:07.1-ide-0:1", SYMLINK+="cdrom"
SUBSYSTEM=="block", ENV{ID_TYPE}=="cd", \
    ENV{ID_PATH}=="pci-0000:00:07.1-ide-1:1", SYMLINK+="cdrom1 dvd"
</tt>
EOF</kbd></pre>
<p>这样，即使你使用不同的 model 来替换原来的设备，符号链接仍然是正确的，它指向在 IDE 总线上旧的位置。
ENV{ID_TYPE}=="cd"&nbsp; 关键字是为了确保符号链接在总线上的那个位置放的不是 CD-ROM 时，能够消失。</p>
<p>当然把两种方法混合使用也是可以的。</p>
</div>
<div class="sect2">
<div class="titlepage">
<h2 class="sect2">7.12.2. Dealing with duplicate devices</h2>
</div>
<p>在 <a href="udev.html" title="7.4. LFS 系统的设备和模块处理">节 7.4, "LFS
系统的设备和模块处理"</a>提到过, <tt class="filename">/dev</tt>
下相同功能设备的顺序是随机的。例如，你有一个 USB 的网络摄像头和一个 TV 的调谐器，有时 <tt class="filename">/dev/video0
指向网络摄像头，</tt><tt class="filename">/dev/video1
指向调谐器，但是在重启之后可能就会改变。除了网卡和声卡之外的其他设备，都可以通过创建 udev 的规则来定制固定的符号链接。</tt>网卡的解决
方法请见 <a href="network.html" title="7.13. 配置网络脚本">节 7.13, "配置网络脚本"</a>,
声卡解决方法请见 <a href="http://www.linuxfromscratch.org/blfs/"><i>BLFS</i></a>。</p>
<p>每一个设备都可能有这个问题（即使这个问题在你现在的发行版中不存在），在 <tt class="filename">/sys/class</tt>
或 <tt class="filename">/sys/block 下找到相应的目录。</tt> 对于视频设备，可能是 <tt
 class="filename">/sys/class/video4linux/video<em class="replaceable"><tt>X</tt></em></tt>。
找出标记设备唯一性的属性（通常是 设备提供商、产品 ID 以及序列号）： <br>
</p>
<pre class="userinput"><kbd class="command">udevinfo -a -p /sys/class/video4linux/video0</kbd></pre>
<p>接下来，写一个创建符号链接的规则，例如：</p>
<pre class="userinput"><kbd class="command">cat &gt;/etc/udev/rules.d/83-duplicate_devs.rules &lt;&lt; EOF<br><tt
 class="literal">
# Persistent symlinks for webcam and tuner
KERNEL=="video*", SYSFS{idProduct}=="1910", SYSFS{idVendor}=="0d81", \
    SYMLINK+="webcam"
KERNEL=="video*", SYSFS{device}=="0x036f", SYSFS{vendor}=="0x109e", \
    SYMLINK+="tvtuner"
</tt>
EOF</kbd></pre>
<p>结果 <tt class="filename">/dev/video0</tt> 和 <tt class="filename">/dev/video1</tt>
设备仍然随机指向调谐器和网络摄像头（因此不应当直接使用），但是符号链接 <tt class="filename">/dev/tvtuner</tt>
和 <tt class="filename">/dev/webcam</tt> 总是指向正确的设备。</p>
<p>关于书写 Udev 规则的更多信息，可以查看 <tt class="filename">/usr/share/doc/udev-096/index.html</tt>。</p>
</div>
</div>
<div class="navfooter">
<ul>
  <li class="prev"> <a accesskey="p" href="hosts.html"
 title="定制 /etc/hosts 文件">后退</a>
    <p>定制 /etc/hosts 文件</p>
  </li>
  <li class="next"> <a accesskey="n" href="network.html" title="配置网络脚本">前
进</a>
    <p>配置网络脚本</p>
  </li>
  <li class="up"><a accesskey="u" href="chapter07.html"
 title="第七章 配置系统启动脚本">上一级</a></li>
  <li class="home"><a accesskey="h" href="../index.html"
 title="Linux From Scratch - 版本 6.2">首页</a>. </li>
</ul>
</div>
</body></html>
